const http = require('node:http');                          //导包 通过require函数导入http模块
const { URL } = require('node:url');                        // 拆解请求字段
const findFile = require('fs');                             //fs模块，读取服务器中的文件
const sqlite3 = require('sqlite3').verbose();              //导入模块用于和数据库连接
const db = new sqlite3.Database('../database/CRUD.db');    //让db去接这个数据库

let isEmpty = 0;           //判断用户名是否为空
let isLogOff = 0;          //判断是否执行注销函数
let isModify = 0;          //判断是否执行修改密码函数

function signUp(a,b){    //注册函数   注册时写入: 用户名、密码和创建时间
	if(isEmpty === 1){
		db.run("INSERT INTO Test (UserName,PassWord,CreateTime) VALUES ($username,$pasword,$createTime)",{
		$username: a,
		$pasword:b,
		$createTime:Date()
	});
	isEmpty = 0;
	}
	console.log("注册成功!");
	console.log("==============================");
	console.log("新注册的用户名为:     "+a);
	console.log("新注册的密码为:       "+b);
	console.log("==============================");
}

function logOff(ID){  //注销函数   删除数据库中指定的数据
	if(isLogOff === 1){
		db.run("DELETE from Test where ID = $id" ,{
		$id: ID
	});
	isLogOff = 0;
	}
	console.log("==============================");
	console.log("注销成功!");
	console.log("==============================");
}

function changePwd(ID,userName,newWord){  //修改密码函数  
	if(isLogOff === 1){
		db.run("UPDATE Test SET PassWord = $newWord WHERE ID = $ID" ,{
		$newWord: newWord,
		$ID:ID
	});
	isModify = 0;
	db.run("UPDATE Test SET UpdateTime = $UpdateTime WHERE ID = $ID" ,{       //写入修改密码的时间
		$UpdateTime: Date(),
		$ID:ID
	});
	}
	console.log("修改密码成功!");
	console.log("==============================");
	console.log("用户名为:     "+userName);
	console.log("新密码为:       "+newWord);
	console.log("==============================");
}




//实现：登录 注册 注销 修改密码
const server = http.createServer((req, res) => {                //创建服务器
  console.log(`请求路径：${req.url} 请求类型：${req.method}`);  //打印请求路径和请求类型
  let url = req.url;                                            //拿到请求路径和参数
  let rUrl = new URL(url,'http://127.0.0.1:8080');              //通过拆解字符串获取请求地址和需要验证的参数
  console.log(rUrl);                                            //在服务器中进行打印
  console.log(rUrl.pathname);
  
  if(req.method === "GET"){                         
	  if(rUrl.pathname === "/login"){                      // 登录功能    拆解字符串 拿到/login
		console.log("login");
		let userName = rUrl.searchParams.get("userName");                  //1.获取输入的用户名与密码
		let passWord = rUrl.searchParams.get("passWord");             
		console.log("输入的用户名为:" + userName);
		console.log("输入的密码为:" + passWord);                            
		findFile.exists('../database/CRUD.db',function(exists){             //在相对路径下寻找数据库文件
			if(exists){                                                     //2.连接数据库开始做用户名和密码校验
				console.log("已连接上数据库！");                      //数据库存在，打开数据库进行操作,查询用户名是否已经存在
				db.serialize(() => {                                
					db.get("SELECT * from Test WHERE UserName = $userName;",{$userName:userName},function(err,data){//判断用户名是否存在
					console.log(data);
					if(data === undefined){                                  //进行登录校验处理
						console.log("用户名不存在!");
						console.log("登录失败!");
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						})
						res.end("false");
					}else if(data.PassWord !== passWord){                       //校验密码
						console.log("用户名存在，但是密码错误!");
						console.log("登录失败!");
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						})
						res.end("false");
					}else{                                                      //用户名和密码都校验成功，返回true给前端
						console.log("登录成功!");
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						})
						res.end("true");
					}
					});
				});                  
			}else{
				console.log("数据库未能成功连接!"); //数据库不存在提示
			}
		});
	  }else if(rUrl.pathname === "/signup"){                //注册功能
		console.log("服务器处理注册业务中。。。");          //拆解字符串 获取前端传过来的参数
		let userName = rUrl.searchParams.get("userName");
		let passWord = rUrl.searchParams.get("passWord"); 
		console.log("输入的用户名为:" + userName);
		console.log("输入的密码为:" + passWord);                             //连接数据库
		findFile.exists('../database/CRUD.db',function(exists){             //在相对路径下寻找数据库文件
			if(exists){
				console.log("已连接上数据库！");                    //数据库存在，打开数据库进行操作,查询用户名是否已经存在
				db.serialize(() => {
					db.get("SELECT * from Test WHERE UserName = $userName;",{$userName:userName},function(err,data){//判断用户名是否存在
					console.log(data);
					if(data === undefined){                              //根据用户名是否存在，分别进行处理
						console.log("用户名不存在!");
						isEmpty = 1;
						signUp(userName,passWord);                        //执行注册函数，写入数据库
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						})
						res.end("ready");
					}else{
						console.log("用户名存在!");
						console.log("注册失败!");                              //注册失败的处理
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						})
						res.end("full");
					}
					});
				});                  
			}else{
				console.log("数据库未能成功连接!"); //数据库不存在
			}
		});
	   }else if(rUrl.pathname === "/logoff"){                   //注销账号功能
		console.log("进行注销校验！");
		console.log("logoff");
		let userName = rUrl.searchParams.get("userName");        //拆解字符串 获取前端传过来的参数
		let passWord = rUrl.searchParams.get("passWord");             
		console.log("输入的用户名为:" + userName);
		console.log("输入的密码为:" + passWord);                             
		findFile.exists('../database/CRUD.db',function(exists){             
			if(exists){                                                     
				console.log("已连接上数据库！");                    //数据库存在，打开数据库进行操作,查询用户名是否已经存在
				db.serialize(() => {                                
					db.get("SELECT * from Test WHERE UserName = $userName;",{$userName:userName},function(err,data){//判断用户名是否存在
					console.log(data);
					if(data === undefined){                                  //进行注销用户名校验处理
						console.log("用户名不存在!");
						console.log("注销失败!");
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						});
						res.end("false1");
					}else if(data.PassWord !== passWord){                       //校验密码
						console.log("用户名存在，但是密码错误!");
						console.log("注销失败!");
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						});
						res.end("false1");
					}else{                                                      //用户名和密码都校验成功
						isLogOff = 1;
						logOff(data.ID);                        //执行注销函数，删除数据
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						});
						res.end("true1");
					}
					});
				});                  
			}else{
				console.log("数据库未能成功连接!"); //数据库不存在
			}
		});
	   }else if(rUrl.pathname === "/changePwd"){                 //修改密码功能
		console.log("进行修改密码校验！");
		console.log("changePwd");
		let userName = rUrl.searchParams.get("userName");                   //1.获取输入的用户名、密码与新密码
		let passWord = rUrl.searchParams.get("passWord"); 
		let newWord = rUrl.searchParams.get("checkPwd"); 
		console.log("输入的用户名为:" + userName);
		console.log("输入的旧密码为:" + passWord);                             //向数据库验证用户名是否存在
		console.log("输入的新密码为:" + newWord); 
		findFile.exists('../database/CRUD.db',function(exists){             //在相对路径下寻找数据库文件
			if(exists){                                                     //2.连接数据库开始做用户名和密码校验
				console.log("已连接上数据库！");                    //数据库存在，打开数据库进行操作,查询用户名是否已经存在
				db.serialize(() => {                                
					db.get("SELECT * from Test WHERE UserName = $userName;",{$userName:userName},function(err,data){//判断用户名是否存在
					console.log(data);
					if(data === undefined){                                  //进行用户名校验处理
						console.log("用户名不存在!");
						console.log("修改密码失败!");
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						});
						res.end("false2");
					}else if(data.PassWord !== passWord){                       //校验密码
						console.log("用户名存在，但是密码错误!");
						console.log("修改密码失败!");
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						});
						res.end("false2");
					}else{                                                      //用户名和密码都校验成功
						isLogOff = 1;
						changePwd(data.ID,data.UserName,newWord);                        //执行修改密码函数，更新数据
						res.writeHead(200,'ok',{
							"Access-Control-Allow-Origin": "*",
							'Content-Type':'application/json; charset = utf8'
						});
						res.end("true2");
					}
					});
				});                  
			}else{
				console.log("数据库未能成功连接!"); //数据库不存在
			}
		});
	   }else if(rUrl.pathname === "/favicon.ico"){                 //对浏览器自带的访问logo进行处理
		console.log("favicon");
		  res.writeHead(200,'ok',{
			  "Access-Control-Allow-Origin": "*",
			  'Content-Type':'application/json; charset = utf8'
		  });
		res.end();
	   }else{
			console.log("other");       //可以调整为只处理 html js css 后缀的文件
			fs.readFile(__dirname + req.url, function (err,data) {
				if (err) {                                //判断是否成功读取文件
				  res.writeHead(404);
				  res.end(JSON.stringify(err));
				  return;
				}
				res.writeHead(200,'ok',{
					"Access-Control-Allow-Origin": "*",
					'Content-Type':'application/json; charset = utf8'
				});
				res.end(data);

		  });
	  }	  
  }else if(req.method === "POST"){  
  
  }else{
	
  }
});
// Now that proxy is running                  //打开请求监听，一直运行  访问端口号是127.0.0.0:8080
server.listen(8080, '127.0.0.1', () => {
	console.log("start server");
});